www.gusucode.com > matlab从零到进阶程序与数据 > matlab从零到进阶程序与数据/第12章 常微分方程(组)数值求解/examp12_3_4.m
function examp12_3_4 % nested function构造微分方程组,注意多了一个一阶导数变量dy(与非隐式微分方程不同) function DyDt = DyDtNestedFun(t,y,dy) DyDt = [dy(1)-y(2); dy(2)*sin(y(4))+dy(4)^2+2*y(1)*y(3)-y(1)*dy(2)*y(4) dy(3)-y(4) y(1)*dy(2)*dy(4)+cos(dy(4))-3*y(3)*y(2)]; end t0 = 0;%自变量的初值 y0 = [1;0;0;1];%初值y0 %fix_y0表明初值y0的值哪些不能改变。1表示对应位置初值不能改变,0为可以改变 fix_y0 = ones(4,1);%本例中y0的值都给出了,因此都不能改变,所有fix_y0全为1 dy0 = [0 3 1 0]';%猜测一下dy0的初值; fix_dy0 = zeros(4,1);%由于本例中dy0的初值是猜测的,可以都改变,因此fix_dy0 全部为0 %调用decic函数来决定 [y02,dy02] = decic(@DyDtNestedFun,t0,y0,fix_y0,dy0,fix_dy0); %求解微分方程 [t y] = ode15i(@DyDtNestedFun,[0 5],y02,dy02);%y02和dy02是由decic输出参数 %画图结果展示 figure; plot(t,y(:,1),'k-','linewidth',2); hold on plot(t,y(:,2),'k--','linewidth',2); plot(t,y(:,3),'k-.','linewidth',2); plot(t,y(:,4),'k:','linewidth',2); %图例,位置自动选择最佳位置 L = legend('{\ity}_1(t)','{\ity}_2(t)','{\ity}_3(t)'... ,'{\ity}_4(t)','Location','best'); set(L,'fontname','Times New Roman'); xlabel('\itt','fontsize',16); end